<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //  1.     3 + 2 +“7”的结果是什么？3 + (2 + "7")的结果又是什么？这两个表达式输出的值是什么类型？数值相加与字符串拼接）
      /* 
        3 + 2 +“7”
        3+2 加法运算->5
        5+"7" 字符串拼接 -> "57"

        3 + (2 + "7")
        2+"7" 字符串拼接 ->"27"
        3+"27" 字符串拼接 ->"327"
      */

      //  2.     6 - false的结果是什么？（减法运算符）
      /* 
            6-0->强制转换数字 6 数字6
        */

      //  3.     6 - "false"和6 + "false"的结果分别是什么？结果输出值是什么数据类型？（减法运算符和加法运算符的不同）
      /* 
      6-"false" ->6 - NaN->NaN  强制转数字
      6+"false" ->"6false" 字符串拼接

      */

      //  4.     请分析console.log(1 + - + + + - + 1)的结果？（一元运算符的运行顺序）
      /* 
        js中的运算符大多数是二元运算符，将两个表达式合成一个稍微复杂一点的表达式，比如a*b 中的`*`就是一个二元运算符。表达式-x 中的 -就是一个一元运算符  条件？表达式1:表达式2
        几元是根据元(操作数)来判断的
        a+b -> 二元
        +b -> 一元
        js中一元加法 从右到左（右关联），二元运算从左到右(左关联)
        左关联相当于把左边的表达式加上小括号 (a OP b ) OP c
        1 + - + + + - + 1
        1 + (- + + + - + 1)
        1 + (- (+ + + - + 1))
        1 +(-(+ (+ + - + 1))) 
        1+ (- (+ (+(+ - + 1))))
        1 + (- (+ (+(+(-1)))))
        1+ 1
        1 - + - - - + - 1 0
      */

      //  5.     下面代码分别输出什么？前自增(自减)与后自增(自减)的区别？（自增自减）
      // let a = 1;
      // let b = ++a + ++a;
      // console.log(b);
      /* 
        let b = (a+1)+(a+1) //2 + 3
        获取的自增之后的a

      */
      // let a = 1;
      // let b = a++ + a++;
      // console.log(b);
      /* 
      获取的自增之前的a
      b = 1 + 2
      3
      */

      //  6.     分析下面代码，请问 j 和 y 分别是多少？(不要运行代码，自己分析后写出答案)（自增自减）
      // var i = 100;
      // i++;
      // j = i++;
      // y = ++j
      /* 
        i->101
        j= 101  i->102
        y= 102 j=102
        */
      //  7.     JS中哪些值通过Boolean对象转换出来的值为`false`?
      /* 
      0 "" null undefined false NaN
      */
      //  8.     分析下面代码的结果并解释原因。（短路运算）
      // let a = 1;
      // let b = 2;

      // console.log(a && b);
      // console.log(a || b);
      /*
      与&&: 如果第一个运算子的布尔值为true，则返回第二个运算子的值(注意返回的是值而不是布尔值);如果第一个运算子的布尔值为false，则直接返回第一个运算子的值，且不对第二个运算子求值。多个&& 可以连用，返回第一个布尔值为false的运算子的值
      ```js
      true && "foo" && 4 && "foo" && "" && true ->''
      ```
      如果都为真，则返回最后一个运算子的值
      1 && 2 && 3->3

      或||:如果第一个运算子的布尔值为true，则返回第一个运算子的值，且不再对第二个运算子求值，如果第一个运算子的布尔值为false，则返回第二个运算子的值
      || 可以连用，返回第一个布尔值为true的运算子的值；如果所有表达式都是false则返回最后一个表达式的值
      ```js
      false ||0||''||5||"foo"||true ->5
      false ||0||undefined ->undefined
      ```
      */
      //  9.     以下代码输出的结果分别是什么？（短路运算）
      // let a = true && "" && 12306;
      // let b = false || "" || undefined || "bluej" || 12306;

      // console.log(a);//""
      // console.log(b);//"bluej"

      //  10.    分析下面代码，分别输出什么？(以注释形式写在console.log后面)（== 和 ===）

      // let str = "12306";
      // let str1 = 1;
      // let num = 12306;
      // let boo = true;

      // console.log(str == num);
      // console.log(str === num);
      // console.log(str1 == boo);
      // console.log(str1 === boo);

      //  11.    等于(==)与严格等于(===)的区别？

      //  12.    下面代码输出的分别是什么？除了typeof还有什么方法可以判断数据类型？（数据类型判断）

      // let str = "bluej";
      // let num = 12306;
      // let boo = false;
      // let arr = [];
      // let obj = {};

      // console.log(typeof str);
      // console.log(typeof num);
      // console.log(typeof boo);
      // console.log(typeof arr);
      // console.log(typeof obj);
      // console.log(typeof undefined);
      // console.log(typeof null);
      // -------------以下题目为提高题,非必做-------------
      // - 写出执行结果,并解释原因(delete)

      // var company = {
      //     address: 'beijing'
      // }
      // var yideng = Object.create(company);
      // delete yideng.address
      // console.log(yideng.address);

      // - 写出执行结果,并解释原因（typeof）

      // var x=1;
      // if(function f(){}){
      //     x += typeof f;
      // }
      // console.log(x)

      // - 写出执行结果,并解释原因（typeof）

      // var foo = {
      //         bar: function(){
      //             return this.baz;
      //         },
      //          baz:1
      //     }
      // console.log(typeof (f=foo.bar)());

      // - 写出执行结果,并解释原因
      // const value  = 'Value is' + !!Number(['0']) ? 'yideng' : 'undefined';
      // console.log(value);
    </script>
  </body>
</html>
